#pragma once

#include <string>
#include <optional>
#include <memory>
#include <sw/redis++/redis++.h>
#include "nlohmann/json.hpp"

using std::string;
using std::optional;
using std::shared_ptr;

using json = nlohmann::json;
using namespace sw::redis;

class CacheUtils {
public:
    static CacheUtils& getInstance();

    /**
     * @brief 添加推荐系统的缓存项。
     * @param key 缓存键 (e.g., "recommender:query")
     * @param value 待缓存的 JSON 数据
     * @return true 如果设置成功，否则 false
     */
    bool addKeyRecommanderCache(const string& key, const json& value);

    /**
     * @brief 添加搜索引擎服务的缓存数据。
     * @param key 缓存键 (e.g., "search:result:keyword")
     * @param value 待缓存的 JSON 数据
     * @return true 如果设置成功，否则 false
     */
    bool addWebPageSearcherCache(const string& key, const json& value);

    /**
     * @brief 获取推荐系统的缓存项。
     * @param key 缓存键
     * @return 包含 JSON 数据的 std::optional 对象。如果缓存未命中或解析失败，则返回 std::nullopt。
     */
    optional<json> getKeyRecommanderCache(const string& key);

    /**
     * @brief 获取搜索引擎服务的缓存数据。
     * @param key 缓存键
     * @return 包含 JSON 数据的 std::optional 对象。如果缓存未命中或解析失败，则返回 std::nullopt。
     */
    optional<json> getWebPageSearcherCache(const string& key);

    // [可选] 获取连接的方法 (如果需要直接操作 Redis)
    Redis& getRedisConnection();

private:
    CacheUtils();
    ~CacheUtils() = default;
    CacheUtils(const CacheUtils&) = delete;
    CacheUtils& operator=(const CacheUtils&) = delete;

private:
    // Redis 连接对象，使用 shared_ptr 确保安全管理
    shared_ptr<Redis> m_redis;
    // 推荐系统缓存的前缀 (Recommender Cache)
    string RECOMMENDER_PREFIX = "rc:";
    // 搜索引擎缓存的前缀 (Searcher Cache)
    string SEARCHER_PREFIX = "sc:";
};